package com.echo.im.domain.message.service;

import com.baomidou.mybatisplus.extension.service.IService;
import com.echo.im.common.vo.GroupMessageVO;
import com.echo.im.domain.message.dto.GroupMessageACKDTO;
import com.echo.im.domain.group.dto.PullGroupOfflineMessageDTO;

import com.echo.im.repository.dao.entity.GroupMessage;

import java.util.List;


/**
 * 定义群组消息服务接口，继承自泛型服务接口 IService
 * 该接口专注于处理群组消息的相关业务逻辑
 * @author echo
 */
public interface GroupMessageService extends IService<GroupMessage> {


    /**
     * 拉取离线消息
     * 用于获取用户在离线期间错过的群组消息
     *
     * @param dto 包含用户和群组信息的数据传输对象
     * @return 返回离线消息列表，包括消息内容和元数据
     */
    List<GroupMessageVO> pullOfflineMessage(PullGroupOfflineMessageDTO dto);

    /**
     * 确认消息已读
     * 用户通过此方法向服务器反馈消息已读状态
     *
     * @param dto 包含用户、群组和消息ID的信息确认对象
     */
    void ackMessage(GroupMessageACKDTO dto);

    /**
     * 查询已读消息的用户列表
     * 用于了解群组中哪些用户已经阅读了特定消息
     *
     * @param groupId 群组ID，定位消息所属群组
     * @param messageId 消息ID，定位特定消息
     * @return 返回已读消息的用户ID列表
     */
    List<Long> findReadedUsers(Long groupId, Long messageId);

    /**
     * 查询群组历史消息
     * 用户可以通过此方法获取群组的历史消息，以指定大小分页形式
     *
     * @param groupId 群组ID，用于定位特定群组
     * @param lastMsgId 上一次获取消息的ID，用于定位从哪条消息开始查询
     * @param size 每次查询的消息数量
     * @return 返回历史消息列表，包括消息内容和元数据
     */
    List<GroupMessageVO> findHistoryMessage(Long groupId, Long lastMsgId, Long size);
}

